package org.example;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @author cxu
 * @version 1.0.0
 * @description 简单模式-消息生产者
 * @date 2021年09月19日 11:22:00
 */
public class MessageConsumer_WorkQueue1 {

    public static void getMessage() throws IOException, TimeoutException {
        // 1.创建连接工厂
        ConnectionFactory connectionFactory = new ConnectionFactory();
        // 2.设置参数
        // ip，默认为本地localhost
        connectionFactory.setHost("127.0.0.1");
        // 端口，默认值5672
        connectionFactory.setPort(5672);
        // 虚拟机,默认值/
        connectionFactory.setVirtualHost("my_vhost");
        // 账号,默认值guest
        connectionFactory.setUsername("admin");
        // 密码,默认值guest
        connectionFactory.setPassword("admin");
        // 3.创建连接 Connection
        Connection connection = connectionFactory.newConnection();
        // 4.创建Channel
        Channel channel = connection.createChannel();
        // 5.创建队列
        /**
         * 参数说明：
         * 1.queue：队列名称
         * 2.durable：是否持久化，当mq重启之后，数据依旧存在
         * 3.exclusive：
         *            - 是否独占，只能有一个监听者该队列
         *            - 当connection关闭时，是否删除队列
         * 4.autoDelete：是否 自动删除，当没有Consumer是，自动删除
         * 5.arguments：参数

         */
        // 如果没有名为“first_queue”的队列，则会创建，否则不会创建
        channel.queueDeclare("work_queue",true,false,false,null);
        // 6.接收消息
        /**
         * handleDelivery()参数：
         * 1.consumerTag:标识
         * 2.envelope:获取一些信息，交换机，路由key
         * 3.properties:配置信息
         * 4.bady:数据
         */
        Consumer consumer = new DefaultConsumer(channel){
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("客户端1消费：" + new String(body));
            }
        };
        channel.basicConsume("work_queue",true,consumer);
        // 7.释放资源？不需要  消费者相当于一个监听者 时刻监听队列
        // 此处只是不让程序结束，等待回调函数执行
        while (true){}
    }
}
